// 接受来自客户端发送的 请求参数( request parameter )
// 1、导入 http 模块
const http = require('http');
const qs = require('querystring');

// 2、指定客户端请求服务后的回调函数
let callback = (req, resp) => { //request 请求， response 响应
    console.log('接受到请求');

    switch (req.method) {
        case 'GET':
            let url = req.url; // 获得本次请求的URL(得到一个string值)
            let length = url.length; // 获得URL中字符个数(即string中字符个数)
            let begin = url.indexOf('?'); // 在 url 中寻找 第一个问号 的位置
            // begin > 0 表示 url 中必定存在 问号 且 问号 不是 url 的第一个字符
            // 因为截取后的子字符串不需要 问号，所以这里采用了 begin = begin + 1
            // 如果 问号 是 url 中最后一个字符则表示其之后无内容，所以必须满足 begin != length
            if (begin > 0 && (begin = begin + 1) != length) {
                let str = url.substring(begin); // 从url中截取[ begin , url.length ) 之间的内容
                // console.log(str);
                let params = qs.parse(str); // 使用 querystring 模块提供的支持解析 字符串为 Objet实例
                console.log(params);
            }
            break;
        case 'POST':
            let chunk = []; // 声明一个数组用来保存缓冲区
            //绑定 data 事件侦听器
            req.on('data', (buf) => {
                chunk.push(buf); // 将缓冲区依次添加到chunk数组中
            });
            //绑定 end 事件侦听器
            req.on('end', () => {
                let buffer = Buffer.concat(chunk); // 将数组中所有缓冲区连接成一个大缓冲区
                // console.log(buffer)
                let str = buffer.toString(); // 将缓冲区解码为字符串
                console.log(str);
                let params = qs.decode(str); // 使用 querystring 模块提供的支持解析 字符串为 Objet实例
                console.log(params);
            });
            break;
    }
    let data = `${Date.now()}`;
    resp.end(data);
}

// 3、创建并返回http.Server对象(class-level)的实例(instance)
let server = http.createServer(callback);

let port = 8080;

// 4、 监听客户端连接到本机的指定端口
server.listen(port, () => {
    console.log(`正在监听(${port})...`);
});
console.log('服务器启动完成！');